IP 头部:IP 头部关心的是对端 VTEP 的 IP 地址,源地址可以用很简单的方式确定,目的地址是虚拟机所在地址宿主机 VTEP 的 IP 地址,需要由某种方式来确定;
MAC 头部:确定了 VTEP 的 IP 地址,MAC 地址可以通过经典的 ARP 方式获取,毕竟 VTEP 在同一个三层网络内
一个VXLAN报文需要确定两个地址信息:
内层报文(对应目的虚拟机/容器)的MAC地址
外层报文(对应目的虚拟机/容器所在宿主机上的 VTEP)IP地址。
如果VNI也是动态感知的,那么VXLAN一共需要知道三个信息:内部MAC、VTEP IP和VNI。
一般有两种方式获得以上VXLAN网络的必要信息:
多播:同一个 VXLAN 网络的VTEP加入同一个多播网络
控制中心:某个集中式的地方保存所有虚拟机的上述信息,自动告知VTEP它需要的信息即可
VXLAN 基本配置命令
VXLAN 接口的基本管理
创建 VXLAN 接口
1 2 3 4 5 6 7 8 9 10
liruilonger@cloudshell:~$ sudo ip link add vxlan0 type vxlan id 42 group 239.1.1.1 dev eth0 dstport 4789 liruilonger@cloudshell:~$ ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 26:e2:b4:04:7f:71 brd ff:ff:ff:ff:ff:ff link-netnsid 0 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:ea:90:45:48 brd ff:ff:ff:ff:ff:ff 4: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 96:cc:e1:a9:24:94 brd ff:ff:ff:ff:ff:ff
ip link add vxlan0 type vxlan id 42: 这部分命令用于创建一个名为 vxlan0 的 VXLAN 接口,并分配一个 ID 为 42 的 VXLAN 网络标识符。
group 239.1.1.1: 这部分命令指定了 VXLAN 组播组的 IP 地址,也就是用于广播 VXLAN 数据包的组播地址。
dev eth0: 这部分命令指定了底层网络接口,也就是将 VXLAN 流量封装在其中的物理网络接口,这里是 eth0。
liruilonger@cloudshell:~$ sudo ip link delete vxlan0 liruilonger@cloudshell:~$ ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 26:e2:b4:04:7f:71 brd ff:ff:ff:ff:ff:ff link-netnsid 0 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:ea:90:45:48 brd ff:ff:ff:ff:ff:ff
liruilonger@cloudshell:~$ sudo ip link add vxlan0 type vxlan id 42 group 239.1.1.1 dev eth0 dstport 4789 liruilonger@cloudshell:~$ ip -d link show vxlan0 5: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 42:3f:2f:d0:4c:7a brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 vxlan id 42 group 239.1.1.1 dev eth0 srcport 0 0 dstport 4789 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
liruilonger@cloudshell:~$ sudo bridge fdb add to 02:42:ea:90:45:48 dst 192.168.0.2 dev vxlan0
02:42:ea:90:45:48 即对端 VTEP 的 MAC 地址,192.19.0.2 即对端 VTEP 的 IP 地址。
1
liruilonger@cloudshell:~$ sudo bridge fdb delete 02:42:ea:90:45:48 dev vxlan0
删除一条转发表项
1
liruilonger@cloudshell:~$ sudo bridge fdb add to 02:42:ea:90:45:48 dst 192.168.0.2 dev vxlan0
查看 VXLAN 接口的转发表:
1 2 3 4
liruilonger@cloudshell:~$ bridge fdb show dev vxlan0 00:00:00:00:00:00 dst 239.1.1.1 via eth0 self permanent 02:42:ea:90:45:48 dst 192.168.0.2 self permanent liruilonger@cloudshell:~$
FDB 表是什么?
网络设备都以 MAC 地址唯一地标识自己,而交换机要实现设备之间的通信就必须知道自己的哪个端口连接着哪台设备,因此就需要一张 MAC 地址与端口号一一对应的表,以便在交换机内部实现二层数据转发。这张二层转发表就是 FDB 表,它主要由 MAC 地址、VLAN 号、端口号和一些标志域等信息组成。如果收到数据帧的目的 MAC 地址不在 FDB 地址表中,那么该数据将被广播给除源端口外,该数据包所属 VLAN 中的其他所有端口。把数据发给其他所有端口的行为称为洪泛。
只有一个机器,这里我们使用两个 Linux netowrk namespace node1,node2 来模拟
1 2 3 4 5
liruilonger@cloudshell:~$ sudo ip netns add node1 liruilonger@cloudshell:~$ sudo ip netns add node2 liruilonger@cloudshell:~$ ip netns list node2 node1
创建两个 网络命名空间,使用 veth pair 来建立通信,配置 IP ,两个命名空间都开启 ipv4 转发,ping 测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
liruilonger@cloudshell:~$ sudo ip link add veth1 netns node1 type veth peer name veth2 netns node2 liruilonger@cloudshell:~$ sudo ip netns exec node1 ip addr add 192.168.1.2/24 dev veth1 liruilonger@cloudshell:~$ sudo ip netns exec node2 ip addr add 192.168.1.3/24 dev veth2 liruilonger@cloudshell:~$ sudo ip netns exec node1 ip link set dev veth1 up liruilonger@cloudshell:~$ sudo ip netns exec node2 ip link set dev veth2 up liruilonger@cloudshell:~$ sudo ip netns exec node1 sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 liruilonger@cloudshell:~$ sudo ip netns exec node2 sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 liruilonger@cloudshell:~$ sudo ip netns exec node1 ping -c 3 192.168.1.3 PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data. 64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.066 ms 64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.047 ms 64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.038 ms
liruilonger@cloudshell:~$ sudo ip netns exec node1 ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.1.3 local 192.168.1.2 dev veth1 liruilonger@cloudshell:~$ sudo ip netns exec node1 ip -d link show dev veth1 2: veth1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether ea:d1:4d:8c:c0:9a brd ff:ff:ff:ff:ff:ff link-netns node2 promiscuity 0 minmtu 68 maxmtu 65535 veth addrgenmode eui64 numtxqueues 2 numrxqueues 2 gso_max_size 65536 gso_max_segs 65535
在名为 node1 的网络命名空间中创建了一个名为 vxlan0 的 VXLAN 接口。
它使用 VXLAN 标识 VID 42,
目标端口号为 4789,
并设置了远程端点的 IP 地址为 192.168.1.3
本地端点的 IP 地址为 192.168.1.2
该 VXLAN 接口使用veth1作为底层网络接口
查看它的详细信息
1 2 3 4
liruilonger@cloudshell:~$ sudo ip netns exec node1 ip -d link show dev vxlan0 3: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether c6:b1:87:67:d9:e4 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 vxlan id 42 remote 192.168.1.3 local 192.168.1.2 dev veth1 srcport 0 0 dstport 4789 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
为刚创建的VXLAN网卡配置IP地址并启用它
1 2
liruilonger@cloudshell:~$ sudo ip netns exec node1 ip addr add 172.17.1.2/24 dev vxlan0 liruilonger@cloudshell:~$ sudo ip netns exec node1 ip link set vxlan0 up
liruilonger@cloudshell:~$ sudo ip netns exec node1 ip route 172.17.1.0/24 dev vxlan0 proto kernel scope link src 172.17.1.2 192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.2
vxlan0 的 FDB 表项中的内容如下
1 2 3 4 5
liruilonger@cloudshell:~$ sudo ip netns exec node1 bridge fdb 33:33:00:00:00:01 dev veth1 self permanent 01:00:5e:00:00:01 dev veth1 self permanent 33:33:ff:8c:c0:9a dev veth1 self permanent 00:00:00:00:00:00 dev vxlan0 dst 192.168.1.3 via veth1 self permanent
默认的VTEP对端地址为192.168.1.3。换句话说,原始报文经过vxlan0后会被内核添加上VXLAN头部,而外部UDP头的目的 IP 地址会被冠上192.168.1.3。这里的IP地址即为我们上面的配置的 远程端点 的 IP
在另一个命名空间也进行相同的配置,配置项这里不做说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
liruilonger@cloudshell:~$ sudo ip netns exec node2 bash root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.1.2 local 192.168.1.3 dev veth2 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip -d link show dev vxlan0 3: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 5a:46:75:cd:ce:9e brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 vxlan id 42 remote 192.168.1.2 local 192.168.1.3 dev veth2 srcport 0 0 dstport 4789 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip addr add 172.17.1.3/24 dev vxlan0 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set vxlan0 up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip route 172.17.1.0/24 dev vxlan0 proto kernel scope link src 172.17.1.3 192.168.1.0/24 dev veth2 proto kernel scope link src 192.168.1.3 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# bridge fdb 33:33:00:00:00:01 dev veth2 self permanent 01:00:5e:00:00:01 dev veth2 self permanent 33:33:ff:6d:21:bb dev veth2 self permanent 00:00:00:00:00:00 dev vxlan0 dst 192.168.1.2 via veth2 self permanent
测试两个命名空间中 veth 对应的 VTEP 内的 vxlan 设备的连通性
1 2 3 4 5 6 7 8 9 10
root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ping -c 3 172.17.1.2 PING 172.17.1.2 (172.17.1.2) 56(84) bytes of data. 64 bytes from 172.17.1.2: icmp_seq=1 ttl=64 time=0.088 ms 64 bytes from 172.17.1.2: icmp_seq=2 ttl=64 time=0.062 ms 64 bytes from 172.17.1.2: icmp_seq=3 ttl=64 time=0.063 ms
liruilonger@cloudshell:~$ sudo ip netns exec node1 bash root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ping -c 5 172.17.1.3 PING 172.17.1.3 (172.17.1.3) 56(84) bytes of data. 64 bytes from 172.17.1.3: icmp_seq=1 ttl=64 time=0.053 ms 64 bytes from 172.17.1.3: icmp_seq=2 ttl=64 time=0.058 ms 64 bytes from 172.17.1.3: icmp_seq=3 ttl=64 time=0.059 ms 64 bytes from 172.17.1.3: icmp_seq=4 ttl=64 time=0.064 ms 64 bytes from 172.17.1.3: icmp_seq=5 ttl=64 time=0.065 ms
liruilonger@cloudshell:~$ sudo ip netns exec node1 bash root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add vxlan1 type vxlan id 43 dstport 4789 local 192.168.1.2 group 224.1.1.1 dev veth1
type vxlan:指定创建的接口类型为 VXLAN。
id 43:设置 VXLAN 网络标识符(VNI)为 43,用于标识 VXLAN 网络中的特定子网。
dstport 4789:指定 VXLAN 数据包在传输时使用的目标端口号。
local 192.168.1.2:设置本地端点的 IP 地址为 192.168.1.2,表示该主机是 VXLAN 的一部分。
root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip addr add 172.17.2.2/24 dev vxlan1 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set vxlan1 up
一样添加了 vxlan1 的路由信息
1 2 3 4
root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip route 172.17.1.0/24 dev vxlan0 proto kernel scope link src 172.17.1.2 172.17.2.0/24 dev vxlan1 proto kernel scope link src 172.17.2.2 192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.2
不同的是 FDB 表项的内容
1 2 3 4 5 6 7 8
root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# bridge fdb 33:33:00:00:00:01 dev veth1 self permanent 01:00:5e:00:00:01 dev veth1 self permanent 33:33:ff:8c:c0:9a dev veth1 self permanent 01:00:5e:01:01:01 dev veth1 self permanent 00:00:00:00:00:00 dev vxlan0 dst 192.168.1.3 via veth1 self permanent 00:00:00:00:00:00 dev vxlan1 dst 224.1.1.1 via veth1 self permanent root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger#
dst字段的值变成了多播地址224.1.1.1,而不是之前对方的VTEP地址,意思是原始报文经过vxlan1后被内核添加上 VXLAN 头部,其外部 UDP 头的目的 IP 地址会被冠上多播地址224.1.1.1。
另一个命名空间做相同的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
liruilonger@cloudshell:~$ sudo ip netns exec node2 bash root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add vxlan1 type vxlan id 43 dstport 4789 local 192.168.1.3 group 224.1.1.1 dev veth2 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip addr add 172.17.2.3/24 dev vxlan1 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set vxlan1 up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip route 172.17.1.0/24 dev vxlan0 proto kernel scope link src 172.17.1.3 172.17.2.0/24 dev vxlan1 proto kernel scope link src 172.17.2.3 192.168.1.0/24 dev veth2 proto kernel scope link src 192.168.1.3 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# bridge fdb 33:33:00:00:00:01 dev veth2 self permanent 01:00:5e:00:00:01 dev veth2 self permanent 33:33:ff:6d:21:bb dev veth2 self permanent 01:00:5e:01:01:01 dev veth2 self permanent 00:00:00:00:00:00 dev vxlan0 dst 192.168.1.2 via veth2 self permanent 00:00:00:00:00:00 dev vxlan1 dst 224.1.1.1 via veth2 self permanent
对 vxlan1 对应的 ip 做 ping 测试
1 2 3 4 5 6 7 8 9 10
root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ping -c 3 172.17.2.2 PING 172.17.2.2 (172.17.2.2) 56(84) bytes of data. 64 bytes from 172.17.2.2: icmp_seq=1 ttl=64 time=0.080 ms 64 bytes from 172.17.2.2: icmp_seq=2 ttl=64 time=0.058 ms 64 bytes from 172.17.2.2: icmp_seq=3 ttl=64 time=0.059 ms
VTEP 通过 IGMP 加入同一个多播组 224.1.1.1。IGMP(Internet Group Management Protocol)是一种用于在 IP 网络中进行组播(multicast)组管理的协议。它允许主机和组播路由器之间进行通信,以确定组播组的成员关系,并使网络能够有效地转发组播流量
liruilonger@cloudshell:~$ sudo ip netns exec node1 bash root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add vxlan2 type vxlan id 45 dstport 4789 local 192.168.1.2 group 225.1.1.1 dev veth1 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add bridge0 type bridge root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set vxlan2 master bridge0 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set vxlan2 up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set bridge0 up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: veth1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether ea:d1:4d:8c:c0:9a brd ff:ff:ff:ff:ff:ff link-netns node2 3: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/ether c6:b1:87:67:d9:e4 brd ff:ff:ff:ff:ff:ff 4: vxlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 4e:fa:e8:b9:51:3a brd ff:ff:ff:ff:ff:ff 5: vxlan2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master bridge0 state UNKNOWN mode DEFAULT group default qlen 1000 link/ether d2:71:34:09:f8:d7 brd ff:ff:ff:ff:ff:ff 6: bridge0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether d2:71:34:09:f8:d7 brd ff:ff:ff:ff:ff:ff root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip netns add pod1 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add pod-veth0 netns pod1 type veth peer name pod-veth1 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set dev pod-veth1 master bridge0 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip netns exec pod1 ip addr add 172.17.3.1/24 dev pod-veth0 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip netns exec pod1 ip link set lo up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip netns exec pod1 ip link set pod-veth0 up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger#
liruilonger@cloudshell:~$ sudo ip netns exec node2 bash root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add vxlan2 type vxlan id 45 dstport 4789 local 192.168.1.3 group 225.1.1.1 dev veth2 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add bridge0 type bridge root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set vxlan2 master bridge0 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set vxlan2 up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set bridge0 up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: veth2@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 Error: Peer netns reference is invalid. link/ether 46:26:8c:6d:21:bb brd ff:ff:ff:ff:ff:ff link-netns node1 3: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 5a:46:75:cd:ce:9e brd ff:ff:ff:ff:ff:ff 4: vxlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 0a:5f:67:a1:21:c0 brd ff:ff:ff:ff:ff:ff 5: vxlan2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master bridge0 state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 76:f8:f6:a1:51:3b brd ff:ff:ff:ff:ff:ff 6: bridge0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 76:f8:f6:a1:51:3b brd ff:ff:ff:ff:ff:ff root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip netns add pod2 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link add pod-veth0 netns pod2 type veth peer name pod-veth1 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip link set dev pod-veth1 master bridge0 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip netns exec pod2 ip addr add 172.17.3.2/24 dev pod-veth0 root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip netns exec pod2 ip link set lo up root@cs-1080702884152-ephemeral-ne4n:/home/liruilonger# ip netns exec pod2 ip link set pod-veth0 up
ip link add vxlan0 type vxlan id 42 dstport 4789 dev eth0 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 192.168.8.101 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 192.168.8.102
liruilonger@cloudshell:~$ sudo ip link add vxlan0 type vxlan id 42 dstport 4789 dev eth0 nolearning liruilonger@cloudshell:~$ ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 6e:a2:d6:9d:e5:ab brd ff:ff:ff:ff:ff:ff link-netnsid 0 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1460 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:e2:0c:50:32 brd ff:ff:ff:ff:ff:ff 4: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 8a:14:bb:79:5c:19 brd ff:ff:ff:ff:ff:ff
添加 FDB 表项,告诉 VTEP 对应的 容器/虚拟机 MAC 地址与对应主机 IP 地址的映射关系:
1 2 3 4 5 6 7 8 9 10 11 12 13
liruilonger@cloudshell:~$ sudo bridge fdb append 6e:a2:d6:9d:e5:ab dev vxlan0 dst 192.168.8.101 liruilonger@cloudshell:~$ sudo bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 192.168.8.101 liruilonger@cloudshell:~$ bridge fdb show 01:00:5e:00:00:01 dev eth0 self permanent 33:33:00:00:00:01 dev docker0 self permanent 01:00:5e:00:00:6a dev docker0 self permanent 33:33:00:00:00:6a dev docker0 self permanent 01:00:5e:00:00:01 dev docker0 self permanent 02:42:e2:0c:50:32 dev docker0 vlan 1 master docker0 permanent 02:42:e2:0c:50:32 dev docker0 master docker0 permanent 00:00:00:00:00:00 dev vxlan0 dst 192.168.8.101 self permanent 6e:a2:d6:9d:e5:ab dev vxlan0 dst 192.168.8.101 self permanent liruilonger@cloudshell:~$
知道了对方的 MAC 地址,则 VTEP 搜索 FDB 表项就知道应该发送到哪个对应的 VTEP 了。
还需要为 VTEP 添加 ARP 表项。所有要通信容器的 IP 地址和 MAC 地址的映射关系都要加进去
添加邻居表的相关数据
1 2 3 4 5 6 7
liruilonger@cloudshell:~$ sudo ip neigh add 10.20.1.4 lladdr 2e:c2:d6:9d:e5:ab dev vxlan0 liruilonger@cloudshell:~$ liruilonger@cloudshell:~$ ip neigh show 10.20.1.4 dev vxlan0 lladdr 2e:c2:d6:9d:e5:ab PERMANENT 10.20.1.3 dev vxlan0 lladdr 6e:a2:d6:9d:e5:ab PERMANENT 10.88.0.1 dev eth0 lladdr 76:78:7b:fc:e5:02 REACHABLE liruilonger@cloudshell:~$